package net.tinyportal.service;


import java.util.ArrayList;
import java.util.List;

import net.tinyportal.persistence.LayoutDao;
import net.tinyportal.persistence.entity.Layout;
import net.tinyportal.persistence.entity.PortletZone;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * Le service de layout sert à gérer les layout d'affichage du portail.
 * On associe pour un id de layout un ensemble de zone,
 * puis pour chacune de ces zones, un ensemble ordonnée de portlet s'y trouvant.
 * @author SBE10599
 *
 */
@Service 
public class LayoutService {


	@Autowired 
	private LayoutDao layoutDao; 

	@Autowired PortletZoneService portletZoneService;

	/**
	 * Retourne le layout dont le nom est passé en paramètre,
	 * s'il est accessible à l'utilisateur
	 * @param LayoutName nom du layout demandé
	 * @return Le layout demandé
	 */
	public Layout getLayout(String LayoutName) {
		return layoutDao.findByLayout(LayoutName);
	}

	/**
	 * Retourne l'ensemble des layouts accessible à l'utilisateur
	 * @return Liste de layout
	 */
	public List<Layout> getAllLayout() {
		return layoutDao.findAll();
	}

	/**
	 * Retourne la liste des portlets présents dans le layout et la zone passés en paramètre
	 * @param layoutName : Nom du layout dont on souhaite récupérer les portlets
	 * @param zoneName : nom de la zone dans le layout
	 * @return : La liste des portlets contenus dans la zone du layout
	 */
	public List<String> findAllPortlet(String layoutName, String zoneName) {
		Layout layout = getLayout(layoutName);
		PortletZone portletZone = layout.getZone(zoneName);
		return portletZone.getPortlets();		  
	}

	/**
	 * Retourne la liste des portlets présents dans le layout et la zone passés en paramètre
	 * @param layoutName : Nom du layout dont on souhaite récupérer les portlets
	 * @param zoneName : nom de la zone dans le layout
	 * @return : La liste des portlets contenus dans la zone du layout
	 */
	public List<String> findAllPortlet(String layoutName) {
		List<String> ret = new ArrayList<String>();
		Layout layout = getLayout(layoutName);
		for (PortletZone portletZone : layout.getZone().values()) {
			ret.addAll(portletZone.getPortlets());
		}
		return ret;
	}
	
	/**
	 * Retourne le (premier) layout taggué comme étant par défaut
	 * @return
	 */
	public Layout getDefaultLayout() {
		 List<Layout> layouts = getAllLayout();
		 for (Layout layout : layouts) {
			 if (layout.isDefaultLayout()) return layout;
		 }
		 return layouts.get(0);
	}

	/**
	 * Retourne la liste des noms des layouts disponible
	 * @return
	 */
	public List<String> getLayoutsName() {
		List<String> layoutsName = new ArrayList<String>();
		for (Layout layout : layoutDao.findAll()) {
			layoutsName.add(layout.getName());
		}
		return layoutsName;
	}

	/**
	 * Crée un nouveau layout, et le persiste automatiquement
	 * @param layoutName
	 */
	public void addSimpleLayout(String layoutName) {
		Layout layout = new Layout();
		layout.setName(layoutName);
		layoutDao.makePersistent(layout);
	}

	/**
	 * Persiste le layout passé en paramètre
	 * @param layout
	 */
	public void persist(Layout layout) {
		for (PortletZone pz : layout.getZone().values()) {
			portletZoneService.persit(pz);
		}
		layoutDao.makePersistent(layout);
	}
}
